static char *urlbase = NULL;
static route_head *trk_head;
static route_head *rte_head;
+static const route_head *current_trk_head; // Output.
/* used for bounds calculation on output */
static bounds all_bounds;
+static int next_trkpt_is_new_seg;
static format_specific_data **fs_ptr;
break;
case tt_trk_trkseg_trkpt:
tag_wpt(attr);
+ if (next_trkpt_is_new_seg) {
+ wpt_tmp->wpt_flags.new_trkseg = 1;
+ next_trkpt_is_new_seg = 0;
+ }
break;
case tt_unknown:
start_something_else(el, attr);
break;
case tt_trk:
break;
+ case tt_trk_trkseg:
+ next_trkpt_is_new_seg = 1;
+ break;
case tt_trk_trkseg_trkpt:
track_add_wpt(trk_head, wpt_tmp);
wpt_tmp = NULL;
gpx_track_hdr(const route_head *rte)
{
fs_xml *fs_gpx;
+ current_trk_head = rte;
gbfprintf(ofd, "<trk>\n");
write_optional_xml_entity(ofd, " ", "name", rte->rte_name);
}
}
- gbfprintf(ofd, "<trkseg>\n");
}
static void
gpx_track_disp(const waypoint *waypointp)
{
fs_xml *fs_gpx;
+ int first_in_trk;
+ first_in_trk = waypointp->Q.prev == ¤t_trk_head->waypoint_list;
+
+ if (waypointp->wpt_flags.new_trkseg) {
+ if (!first_in_trk) {
+ gbfprintf(ofd, "</trkseg>\n");
+ }
+ gbfprintf(ofd, "<trkseg>\n");
+ }
gbfprintf(ofd, "<trkpt lat=\"" FLT_FMT_T "\" lon=\"" FLT_FMT_T "\">\n",
waypointp->latitude,
static void
gpx_track_tlr(const route_head *rte)
{
- gbfprintf(ofd, "</trkseg>\n");
+ if (!QUEUE_EMPTY(¤t_trk_head->waypoint_list)) {
+ gbfprintf(ofd, "</trkseg>\n");
+ }
gbfprintf(ofd, "</trk>\n");
+ current_trk_head = NULL;
}
static
void
track_add_wpt( route_head *rte, waypoint *wpt )
{
+ // First point in a track is always a new segment.
+ // This improves compatibility when reading from
+ // segment-unaware formats.
+ if (QUEUE_EMPTY(&rte->waypoint_list)) {
+ wpt->wpt_flags.new_trkseg = 1;
+ }
+
any_route_add_wpt( rte, wpt, &trk_waypts, 0 );
}
static void
any_route_del_wpt( route_head *rte, waypoint *wpt, int *ct)
{
+ if (wpt->wpt_flags.new_trkseg && wpt != (waypoint*)QUEUE_LAST(&rte->waypoint_list)) {
+ waypoint* wpt_next = (waypoint*)QUEUE_NEXT(&wpt->Q);
+ wpt_next->wpt_flags.new_trkseg = 1;
+ }
+ wpt->wpt_flags.new_trkseg = 0;
dequeue( &wpt->Q );
rte->rte_waypt_ct--;
if ( ct ) (*ct)--;
QUEUE_FOR_EACH(&rh->waypoint_list, elem, tmp) {
waypoint *waypointp;
waypointp = (waypoint *) elem;
- (*cb)(waypointp);
+ (*cb)(waypointp);
}
}